[uuid](https://en.wikipedia.org/wiki/Universally_unique_identifier#:~:text=A universally unique identifier (UUID,are for practical purposes unique.))
1 个 UUID 是 1 个 16 字节(128 位)的数字; 为了方便阅读,通常将 UUID 表示成如下的方式:
123e4567-e89b-12d3-a456-426614174000
缺点:
缺点:
可以使用 Redis 的原子操作 INCR
或者 INCRBY
来实现
优点:
缺点:
原文:https://tech.meituan.com/2017/04/21/mt-leaf.html
使用 DB 号段保证唯一,Leaf Node 启动时或者在号段快用完时会从 DB 重新申请一段号段。
缺点:
ID 生成方式类似 Snowflake。
workerId 使用 Zookeeper 顺序结点的特性来实现,保证 workerId 唯一。
周期性上报时间给 Zookeeper,启动时做时间检验,时间回拨则告警。
原文:https://mp.weixin.qq.com/s/JqIJupVKUNuQYIDDxRtfqA
可以看出,微信序列号生成器是在用户级别趋势递增。像微信这么大的消息量,如果像美团 Leaf Segment 一样在业务级别递增的话,那么序列号生成器肯定会成为性能瓶颈;而且美团 Leaf Segment 并不能保证全局趋势递增,并不能适用 IM Timeline 模型。
优点:
缺点:
原文:https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md.html
基于 Snowflake
使用 RingBuffer 缓存 UID,并通过双 RingBuffer+CacheLine 补齐方式提高并发,解决了伪共享问题
workerId 由 MySQL 自增 Id 分配。
通过借用未来时间来解决 Sequence 的并发限制,即每秒只能有 8192 个并发,超过则需要使用未来的时间来生成。
时间不是取的机器时间,而是用启动时间自增来实现。
缺点:
原文:https://docs.mongodb.com/v3.2/reference/method/ObjectId/
缺点:
本方案参考百度 UidGenerator,解决了 workerId 无法复用的问题
使用 Snowflake,利用 MySQL 自增 Id 分配 workerId,并复用 workerId;同时利用时间号段保证时间趋势递增
使用 Snowflake,64bit 的 Id 设计如下:
因此,最多有 2^10 = 1024 个 workerId,分配 WorkerId 的 DB Schema 设计如下:
CREATE TABLE IF NOT EXISTS `worker_node_tab`
(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'worker id',
ip CHAR(64) NOT NULL COMMENT 'host IP',
port CHAR(64) NOT NULL COMMENT 'host port',
last_timestamp TIMESTAMP NOT NULL COMMENT 'last timestamp',
duration_step TIMESTAMP NOT NULL COMMENT 'duration',
mtime TIMESTAMP NOT NULL COMMENT 'modified time',
ctime TIMESTAMP NOT NULL COMMENT 'created time',
PRIMARY KEY(id)
) COMMENT='WorkerID Assigner for UID Generator',ENGINE = INNODB;
服务启动流程:
备注:因为百度 UidGenerator workerId 不会重复,因此不用担心 timestamp 重复;我们需要复用 workerId,因此必须要保证 timestamp 是趋势递增的
生成 Id 流程:
duration_step 可以设置为两天(或更长),每隔一天异步到 DB 申请一个时间号段(即设置 DB last_timestamp += duration_step);可以做到弱依赖 DB
[Universally unique identifier](https://en.wikipedia.org/wiki/Universally_unique_identifier#:~:text=A universally unique identifier (UUID,are for practical purposes unique.))